package com.sheng.leetcode.year2023.month02.day14;

import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

/**
 * @author by ls
 * @date 2023/2/14
 * <p>
 * 1124. 表现良好的最长时间段<p>
 * <p>
 * 给你一份工作时间表 hours，上面记录着某一位员工每天的工作小时数。<p>
 * 我们认为当员工一天中的工作小时数大于 8 小时的时候，那么这一天就是「劳累的一天」。<p>
 * 所谓「表现良好的时间段」，意味在这段时间内，「劳累的天数」是严格 大于「不劳累的天数」。<p>
 * 请你返回「表现良好时间段」的最大长度。<p>
 * <p>
 * 示例 1：<p>
 * 输入：hours = [9,9,6,0,6,6,9]<p>
 * 输出：3<p>
 * 解释：最长的表现良好时间段是 [9,9,6]。<p>
 * <p>
 * 示例 2：<p>
 * 输入：hours = [6,6,6]<p>
 * 输出：0<p>
 * <p>
 * 提示：<p>
 * 1 <= hours.length <= 10^4<p>
 * 0 <= hours[i] <= 16<p>
 * <p>
 * 来源：力扣（LeetCode）<p>
 * 链接：<a href="https://leetcode.cn/problems/longest-well-performing-interval">1124. 表现良好的最长时间段</a><p>
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。<p>
 */
public class LeetCode1124 {

    @Test
    public void test01() {
//        int[] hours = {9, 9, 6, 0, 6, 6, 9};
//        int[] hours = {6, 6, 6};
        int[] hours = {6, 9, 9};
        System.out.println(new Solution().longestWPI(hours));
    }
}

class Solution {
    public int longestWPI(int[] hours) {
        // s 代表从 0 到 i 部分劳累天数和不劳累天数的差值
        int ans = 0, s = 0;
        Map<Integer, Integer> map = new HashMap<>(16);
        for (int i = 0; i < hours.length; i++) {
            s += hours[i] > 8 ? 1 : -1;
            if (s > 0) {
                // 代表当前为表现良好的时间段
                ans = i + 1;
            } else if (map.containsKey(s - 1)) {
                // 判断昨天是否为表现良好的时间段，是，则与之前的 ans 进行对比
                ans = Math.max(ans, i - map.get(s - 1));
            }
            // 判断 s 是否存在，不存在则插入
            map.putIfAbsent(s, i);
        }
        return ans;
    }
}

// 暴力破解
//class Solution {
//    public int longestWPI(int[] hours) {
//        // 双指针
//        int count = 0;
//        for (int i = 0; i < hours.length; i++) {
//            // i1 代表劳累的天数，i2 代表不劳累的天数
//            int i1 = 0, i2 = 0;
//            if (hours[i] <= 8) {
//                i2 = 1;
//            } else {
//                i1 = 1;
//            }
//            if (count == 0 && i1 > i2) {
//                count = 1;
//            }
//            for (int j = i + 1; j < hours.length; j++) {
//                if (hours[j] <= 8) {
//                    i2++;
//                } else {
//                    i1++;
//                }
//                if (i1 > i2) {
//                    count = Math.max(count, i1 + i2);
//                }
//            }
//            if (i1 > i2) {
//                count = Math.max(count, i1 + i2);
//            }
//        }
//        return count;
//    }
//}
